#include <stdio.h>
#include <time.h>
#include <wx/wx.h>
#include <wx/string.h>
#include "main.h"
#include "ids.h"
#include "Juego.h"
#include "ventanaPrincipal.h"
#include <wx/window.h>
#include <wx/radiobox.h>
#include <wx/textctrl.h>
#include <wx/stattext.h>
#include <wx/panel.h>
#include <wx/sizer.h>



/*******************************************************
ACA SE VAN A DECLARAR LAS RUTINAS DE ATENCION DE EVENTOS
*******************************************************/
BEGIN_EVENT_TABLE(VentanaPrincipal, wxFrame)
    EVT_MENU(nuevoJuego_ID, VentanaPrincipal::comenzarNuevaPartida)
    EVT_MENU(wxID_EXIT,  VentanaPrincipal::OnQuit)
    EVT_CLOSE(VentanaPrincipal::OnQuitX)
    //EVT_RADIOBOX(eleccion1_ID, VentanaPrincipal::prueba) NO ME INTERESA ESTE EVENTO
    EVT_BUTTON(boton_ID, VentanaPrincipal::ingresarIntento)
END_EVENT_TABLE()



/***** ESTA ES LA DEFINICION DE UNA wxFrame CON TODOS SUS PARAMETROS *****

wxFrame(wxWindow* parent, wxWindowID id, const wxString& title, const
wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style =
wxDEFAULT_FRAME_STYLE, const wxString& name = "frame")

*************************************************************************/

VentanaPrincipal::VentanaPrincipal(AdivinaLosColores* App, wxString title)
                : wxFrame(NULL, wxID_ANY, title) {

    Centre();

    //guardo la aplicación
    _App = App;

    //creamos un menu simple
    _fileMenu = new wxMenu;

    //agrega un string item al final del menu
    _fileMenu->Append(nuevoJuego_ID, _T("&Nuevo juego\tF2"), _T("Comienza una nueva partida"));
    _fileMenu->Append(wxID_EXIT, _T("&Salir\tAlt-F4"), _T("Termina el programa"));

    //declaramos y creamos la barra de menu
    _menuBar = new wxMenuBar();

    //agrego el elemento a la barra de menu
    _menuBar->Append(_fileMenu, _T("&Archivo"));

    //le seteamos a VentanaPrincipal la barra de menu
    SetMenuBar(_menuBar);



    //Creo los paneles donde voy a colocar todos los elementos
    _panel1 = new wxPanel(  this,
                            wxID_ANY,
                            /*wxDefaultPosition*/wxPoint(0,0),
                            /*wxDefaultSize*/wxSize(400,100),
                            wxTAB_TRAVERSAL,
                            _T("panel1"));

    _panel2 = new wxPanel(  this,
                            wxID_ANY,
                            /*wxDefaultPosition*/wxPoint(410,0),
                            /*wxDefaultSize*/wxSize(200,100),
                            wxTAB_TRAVERSAL,
                            _T("panel2"));

    _panel3 = new wxPanel(  this,
                            wxID_ANY,
                            /*wxDefaultPosition*/wxPoint(0,160),
                            /*wxDefaultSize*/wxSize(250,250),
                            wxTAB_TRAVERSAL,
                            _T("panel3"));

    _panel4 = new wxPanel(  this,
                            wxID_ANY,
                            /*wxDefaultPosition*/wxPoint(250,160),
                            /*wxDefaultSize*/wxSize(250,250),
                            wxTAB_TRAVERSAL,
                            _T("panel4"));

    //creo las botoneras de eleccion mutuamente excluyentes
    _eleccion1 = new wxRadioBox(    _panel3,
                                    eleccion1_ID,
                                    _T("1"),
                                    wxDefaultPosition/*wxPoint(0,100)*/,
                                    /*wxDefaultSize*/wxSize(100,250),
                                    8,
                                    opciones,
                                    8,
                                    wxRA_SPECIFY_ROWS,
                                    wxDefaultValidator,
                                    _T("radioBox1") );

    _eleccion2 = new wxRadioBox(    _panel3,
                                    eleccion2_ID,
                                    _T("2"),
                                    /*wxDefaultPosition*/wxPoint(100,0),
                                    /*wxDefaultSize*/wxSize(100,250),
                                    8,
                                    opciones,
                                    8,
                                    wxRA_SPECIFY_ROWS,
                                    wxDefaultValidator,
                                    _T("radioBox2") );

    _eleccion3 = new wxRadioBox(    _panel4,
                                    eleccion3_ID,
                                    _T("3"),
                                    wxDefaultPosition/*wxPoint(300,100)*/,
                                    /*wxDefaultSize*/wxSize(100,250),
                                    8,
                                    opciones,
                                    8,
                                    wxRA_SPECIFY_ROWS,
                                    wxDefaultValidator,
                                    _T("radioBox3") );

    _eleccion4 = new wxRadioBox(    _panel4,
                                    eleccion4_ID,
                                    _T("4"),
                                    /*wxDefaultPosition*/wxPoint(100,0),
                                    /*wxDefaultSize*/wxSize(100,250),
                                    8,
                                    opciones,
                                    8,
                                    wxRA_SPECIFY_ROWS,
                                    wxDefaultValidator,
                                    _T("radioBox4") );

    //aqui voy a ir incertando los resultados de cada intento
    _resultados = new wxTextCtrl(   _panel1,
                                    resultados_ID,
                                    _T("Esperando nuevo juego"),
                                    /*wxDefaultPosition*/wxPoint(0,20),
                                    /*wxDefaultSize*/wxSize(400,90),
                                    wxTE_READONLY | wxTE_MULTILINE,
                                    wxDefaultValidator,
                                    _T("") );

    //aqui se van a mostrar cuantas jugadas restan
    wxTextValidator OnlyNum = wxTextValidator(wxFILTER_NUMERIC);
    _jugadasRestantes = new wxTextCtrl( _panel2,
                                        jugadasRestantes_ID,
                                        _T(""),
                                        wxPoint(0,25),
                                        /*wxDefaultSize*/wxSize(90,20),
                                        wxTE_CENTRE | wxTE_READONLY,
                                        OnlyNum,
                                        _T("") );


    //con este boton se va a ingresar una nueva jugada
    _ingresarJugada = new wxButton( _panel2,
                                    boton_ID,
                                    _T("Intentar!"),
                                    wxPoint(0,50),
                                    wxDefaultSize,
                                    0,
                                    wxDefaultValidator,
                                    _T("button"));

    //etiqueta para el texto
    _labelResultados = new wxStaticText(    _panel1,
                                            wxID_ANY,
                                            _T("Estadisticas y resultado del juego actual:"),
                                            wxDefaultPosition,
                                            /*wxDefaultSize*/wxSize(400,20),
                                            0,
                                            _T("staticText"));
    //etiqueta para jugadas restantes
    _labelRestantes = new wxStaticText( _panel2,
                                        wxID_ANY,
                                        _T("Jugadas Restantes"),
                                        wxDefaultPosition,
                                        /*wxDefaultSize*/wxSize(200,20),
                                        0,
                                        _T("staticText"));

    //creo un sizer para el panel 1
    _sizerPanel1 = new wxBoxSizer(wxVERTICAL);
	_sizerPanel1->Add(_labelResultados, wxSizerFlags().Proportion(0).Expand().Border(wxALL,4));
	_sizerPanel1->Add(_resultados, wxSizerFlags().Proportion(1).Expand().Border(wxALL,4));
	_panel1->SetSizer/*AndFit*/(_sizerPanel1);

	//creo un sizer para el panel 2
    _sizerPanel2 = new wxBoxSizer(wxVERTICAL);
	_sizerPanel2->Add(_labelRestantes, wxSizerFlags().Proportion(0).Expand().Border(wxALL,4));
	_sizerPanel2->Add(_jugadasRestantes, wxSizerFlags().Proportion(0).Expand().Border(wxALL,4));
	_sizerPanel2->Add(_ingresarJugada, wxSizerFlags().Proportion(0).Expand().Border(wxALL,4));
	_panel2->SetSizer/*AndFit*/(_sizerPanel2);

	//creo un sizer para el panel 3
    _sizerPanel3 = new wxBoxSizer(wxHORIZONTAL);
	_sizerPanel3->Add(_eleccion1, wxSizerFlags().Proportion(1).Expand().Border(wxALL,4));
	_sizerPanel3->Add(_eleccion2, wxSizerFlags().Proportion(1).Expand().Border(wxALL,4));
	_panel3->SetSizer/*AndFit*/(_sizerPanel3);

	//creo un sizer para el panel 4
    _sizerPanel4 = new wxBoxSizer(wxHORIZONTAL);
	_sizerPanel4->Add(_eleccion3, wxSizerFlags().Proportion(1).Expand().Border(wxALL,4));
	_sizerPanel4->Add(_eleccion4, wxSizerFlags().Proportion(1).Expand().Border(wxALL,4));
	_panel4->SetSizer/*AndFit*/(_sizerPanel4);

	//creo un sizer para dejar panel 1 y 2 alineados horizontalmente
    _upSizer = new wxBoxSizer(wxHORIZONTAL);
	_upSizer->Add(_panel1, wxSizerFlags().Proportion(1).Expand().Border(wxALL,4));
	_upSizer->Add(_panel2, wxSizerFlags().Proportion(0).Expand().Border(wxALL,4));

	//creo un sizer para dejar panel 3 y 4 alineados horizontalmente
    _downSizer = new wxBoxSizer(wxHORIZONTAL);
	_downSizer->Add(_panel3, wxSizerFlags().Proportion(1).Expand().Border(wxALL,4));
	_downSizer->Add(_panel4, wxSizerFlags().Proportion(1).Expand().Border(wxALL,4));

	//creo un top sizer
    _topSizer = new wxBoxSizer(wxVERTICAL);
	_topSizer->Add(_upSizer, wxSizerFlags().Proportion(1).Expand().Border(wxALL,4));
	_topSizer->Add(_downSizer, wxSizerFlags().Proportion(1).Expand().Border(wxALL,4));
	SetSizerAndFit(_topSizer);//con esto lo dejo como definitivo y hago que se la ventana se ajuste a este sizer

	_juego = NULL;

}


void VentanaPrincipal::Quit(){
    // true is to force the frame to close
    Close(true);//esto provoca un EVT_CLOSE
}








/* Como no queremos hacer nada más con este evento, ponemos lo de WXUNUSED. */
void VentanaPrincipal::OnQuit(wxCommandEvent& WXUNUSED(event)) {
    Quit();
}

/* Esta función es la que realmente cierra el programa y destruye todas las estructuras e información que así lo querieran. */
void VentanaPrincipal::OnQuitX(wxCloseEvent& WXUNUSED(event)) {

    /**************************************/
     /***** | Aqui todas las ordenes | *****/
     /***** |  previas al cerrado    | *****/
     /******V************************V******/

     if(_juego != NULL) delete _juego;

     /******A************************A******/
     /***** | Aqui todas las ordenes | *****/
     /***** |  previas al cerrado    | *****/
     /**************************************/

     Destroy();
}



/********************************************************
ACA VAN LAS FUNCIONES QUE CONECTAN GUI CON EL JUEGO
********************************************************/


void VentanaPrincipal::comenzarNuevaPartida(wxCommandEvent& event){

    srand(time(NULL));

    Color adivinar[4] = {rand() % 8, rand() % 8, rand() % 8, rand() % 8};

    _juego = new Juego(20, adivinar);

    _resultados->Clear();
    _resultados->AppendText(_T("Elige los 4 colores a adivinar, y prueba tu suerte con el boton \"Intentar!\"\n\n\n"));
    _resultados->AppendText(_T("Tienes 20 intentos, asi que mejor que entiendas rapido las pistas!"));
}



void VentanaPrincipal::ingresarIntento(wxCommandEvent& event){

    if(_juego != NULL){

        Color apuesta[4] =  {   _eleccion1->GetSelection(),
                                _eleccion2->GetSelection(),
                                _eleccion3->GetSelection(),
                                _eleccion4->GetSelection()
                            };

        _juego->ingresarJugada(apuesta);

        if(_juego->termino()){
            _resultados->Clear();
            if(_juego->gano()){
                _resultados->AppendText(_T("HAS GANADO!\n"));
            }
            else{//si perdió
                _resultados->AppendText(_T("HAS PERDIDO!\n"));
            }
            _resultados->AppendText(_T("Los colores eran: "));
            _resultados->AppendText(opciones[apuesta[0]]);
            _resultados->AppendText(_T(", "));
            _resultados->AppendText(opciones[apuesta[1]]);
            _resultados->AppendText(_T(", "));
            _resultados->AppendText(opciones[apuesta[2]]);
            _resultados->AppendText(_T(" y "));
            _resultados->AppendText(opciones[apuesta[3]]);
            delete _juego;
            _juego = NULL;
        }
        else{//si no terminó
            _resultados->AppendText(_T("\n\n\n"));
            if(_juego->cantidadAciertos() > 0){
                _resultados->AppendText(_T("Ud ha acertado "));
                _resultados->AppendText(wxString::Format(_T("%d\n"), _juego->cantidadAciertos()));
            }
            if(_juego->cantidadCercanos() > 0){
                _resultados->AppendText(_T("Ud tiene "));
                _resultados->AppendText(wxString::Format(_T("%d "), _juego->cantidadCercanos()));
                _resultados->AppendText(_T("mal ordenados"));
            }
            if(_juego->cantidadAciertos() == 0 && _juego->cantidadCercanos() == 0){
                _resultados->AppendText(_T("Ninguno de los 4 colores aparecen escondidos!"));
            }
            _jugadasRestantes->Clear();
            _jugadasRestantes->AppendText(wxString::Format(_T("%d"), _juego->jugadasRestantes()));
        }
    }
    else{

        _resultados->Clear();
        _resultados->AppendText(_T("Esperando el comienzo de un nuevo juego..."));

    }
}
